/*
    This file is part of Epoch <http://code.google.com/p/epoch/>.
    
    Copyright (C) 2011  Adam Meily <meily.adam@gmail.com>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/


#ifndef SQLRECORDSTORE_H
#define SQLRECORDSTORE_H

#include "../Models/Revision.h"
#include "../Models/Device.h"

#include "RecordStore.h"

#include "../Config/DatabaseConfig.h"

#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlRecord>

class SqlRecordStore : public RecordStore
{
public:
    SqlRecordStore(const DatabaseConfig& config, const QString& id);
    virtual ~SqlRecordStore();
    
    virtual Revision revision(int id, const Share& share);
    virtual QList< Revision > allRevisions(const QByteArray& uuid, const Share& share);
    virtual QList< Revision > allRevisions(const Revision& revision);
    virtual Revision latestRevision(const QByteArray& uuid, const Share& share);
    virtual Device device(const QByteArray& uuid);
    
    virtual QList<Share> shares(int deviceId);
    
    virtual int save(Revision& revision, const Backup& backup);
    
    const QSqlDatabase& backend() const;
    const QString& id() const;
    
    int open();
    
protected:
    Revision toRevision(const QSqlRecord& record, const Share& share) const;
    Device toDevice(const QSqlRecord& record, const QList<Share>& shares) const;
    Share toShare(const QSqlRecord& record, const Device& device) const;
    void loadShares(Device& device) const;
    
private:
    QSqlDatabase m_backend;
    DatabaseConfig m_config;
    QString m_id;
};

#endif // SQLRECORDSTORE_H
